/**
 * 纯 Axios 层封装
 * 1. 全局 baseURL、timeout、withCredentials
 * 2. 请求拦截：自动带 token
 * 3. 响应拦截：http 状态码非 2xx 时统一 message.error
 */
import { getToken } from '@/utils/auth';
import { message } from 'antd';
import axios, { type AxiosInstance } from 'axios';

export const service: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: Number(import.meta.env.VITE_TIMEOUT) || 10000,
  // 跨域请求时是否需要使用凭证
  withCredentials: false,
  headers: {
    'Content-Type': 'application/json',
  },
});

/** 请求拦截器 */
service.interceptors.request.use(
  (config) => {
    const token = getToken();
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  },
);

/** 响应拦截器*/
service.interceptors.response.use(
  (response) => response,
  (error) => {
    // 只处理需要全局跳转/特殊处理的错误
    if (!error.response) {
      // 无网络
      message.error('网络连接失败，请检查网络');
      return Promise.reject({ code: 'NETWORK_ERROR' });
    }
    const { status } = error.response;
    if (status === 401) {
      // 未授权，跳转登录
      message.error('登录状态已过期，请重新登录');
      window.location.href = '/login';
    }
    // 其他错误透传
    return Promise.reject(error);
  },
);
